ML Lecture 8-1: “Hello world” of deep learning 學習筆記

ML Lecture 8-1: “Hello world” of deep learning 學習筆記

1. Why Keras, not Tensorflow ?

Tensorflow是一個深度學習框架,非常flexible,你可以想成一個微分器,所以學起來是有一些難度的。

相較之下,Keras提供友好且直觀的interface來應用深度學習,但是也有足夠的彈性讓創造自己的NN架構,就好像是疊積木一樣。

2. ‘Hello World!’ of Keras

  • Step 1 : define a set of function
1
2
3
4
5
6
7
8
9
model = Sequential()
model.add( Dense( input_dim = 28*28,
output_dim = 500 ) )
model.add( Activation('sigmoid') )
#可以選softplus, softsign, relu, tanh, hard_sigmoid, linear,也可自己寫
model.add( Dense( output_dim = 500 ) )
model.add( Activation('sigmoid') )
model.add( Dense( output_dim = 10 ) )
model.add( Activation('softmax') )
  • Step 2 : goodness of function
1
2
3
model.compile(lost = 'categorical_crossentropy',
optimizer = 'adam',
metrics = ['accuracy']))
  • Step 3 : pick the best function

optimizer = 'adam'這些都是gradient descent based的方法,可以有:SGD,RMSprop,Adagrad,Adadelta,Adam,Adamax,Nadam

最後進行訓練:

1
model.fit(x_train, y_train, batch_size = 100, nb_epocj = 20)

假設有1000個樣本,每個樣本是28*28,dimension就是1000*28*28

3. Mini-batch

我們並不會去minimize total loss,這樣太耗費效能與時間了,於是就誕生了mini-batch這個方法,每一個batch都是樣本中隨機挑選的。

img

步驟為:

  • 隨機初始NN的參數
  • 挑第一個batch ${L}’={l}^{1}+{l}^{31}+…$並更新一次參數
  • 挑第二個batch ${L}’’={l}^{2}+{l}^{16}+…$並更新一次參數
  • 直到所有mini-batch都被挑出來了

以上過程就稱為1個epoch。

如果batch_size設為1的話,有stochastic gradient descent的意涵,天下武功唯快不破。但是這樣的話為什麼不直接用SGD,而是用mini-batch呢?李老師說這是實作的議題。

img

我們原本預期SGD可以比較快,亦即能更新更多次參數,但事後來看,size為1進行1個epoch反而要花更長時間,而且batch size為10反而更穩定。那為什麼batch size設比較大的時候反而比較快?歸功於平行運算,batch中每一個可以同時計算。

那我們可以把batch開到最大嗎?硬體終究有限制,撇開硬體的話,在訓練的時後很容易馬上陷入local minima裡面。(等於沒有隨機性的好處)

4. Evaluate

1
2
3
4
5
6
7
#case1
score = model.evalute(x_test, y_test)
print('Total lose on Testing Set:', score[0])
print('Accuracy of Testing Set:', score[1])

#case2
result = model.predict(x_test)

整個模型的運用就像熟悉的朋友scikit-learn一樣。

如果我的文章有幫到你的話,歡迎用街口支付給我一些鼓勵